/* Universidad del Valle de Guatemala
 * CC2003 - Algoritmos y Estructuras de Datos
 * HOJA DE TRABAJO #5.1
 * Fecha de Entrega: Jueves 22 de Septiembre de 2011
 */

/**
 * Clase que define las acciones que puede realizar la Cola implementada por medio de un Array. 
 * @author José Antonio Bagur - 10275
 */
public class ArrayBanco <E> extends AbstractQueue <E> {
    
    /* ATRIBUTOS DE LA CLASE ARRAYBANCO */
    
    public E[] elementos;
    public int inicio, fin; 
    
    /* CONSTRUCTOR DE LA CLASE ARRAYBANCO */
    
    /**
     * Constructor de la Clase ArrayBanco, inicializa el Array con un número de elementos determinado.
     * @param n elementos iniciales. 
     */
    public ArrayBanco(int n) {
        this.tamaño = n;
        elementos = (E[]) new Object[this.tamaño];
        inicio = 0;
        fin = 0;
    }
    
    /* MÉTODO QUEUE */
    
    /**
     * Método que permite ingresar elementos a la Cola implementada por medio del Array.
     * @param elemento a incluir en la Cola.
     * @throws QueueOverflow 
     */
    public void add(E elemento) throws QueueOverflow {
        if((fin >= inicio) && !(this.getFull())) {
            elementos[fin] = elemento;
            fin++;
            fin = fin % this.tamaño;
            this.contador++;
        } else {
            throw new QueueOverflow("DESBORDAMIENTO");
        }
    }
    
    /* MÉTODO DEQUEUE */
    
    /**
     * Método que permite extraer el primer elemento de la cabeza de la Cola implementada por medio del Array.
     * @return E elemento de la cabeza de la Cola. 
     * @throws QueueUnderflow 
     */
    public E remove() throws QueueUnderflow {
        if(!this.isEmpty()) {
            E temporal = elementos[inicio];
            inicio++;
            inicio = inicio % this.tamaño;
            contador--;
            return (E)temporal;
        } else {
            throw new QueueUnderflow("SUBDESBORDAMIENTO");
        }
    }
    
    /* MÉTODO PEEK */
    
    /**
     * Método que retorna el elemento presente en la cabeza de la Cola implementada por medio del Array; no lo extrae de la Cola.
     * @return E elemento de la cabeza de la Cola
     * @throws QueueUnderflow 
     */
    public E peek() throws QueueUnderflow {
        if(!this.isEmpty()) {
            return (E)elementos[inicio];
        } else {
            throw new QueueUnderflow("SUBDESBORDAMIENTO");
        }   
    }    
    
} // FIN DE LA CLASEARRAYBANCO 
